package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.SQLException;
import java.util.List;

import model.Artikel;
import model.Bestellung;
import model.Person;


/**
 * @author spiller.sebastian
 *
 */
public class DbManager implements DataSource, PersonSource, ArtikelSource, BestellungSource {
	
	/**
	 * 
	 */
	private static DbManager DbManagerInstance;
	
	/**
	 * 
	 */
	private Connection con;
	
	/**
	 * 
	 */
	private Statement  stmt;

	
	/**
	 * 
	 */
	private PersonBuilder PersonBuilderInstance = PersonBuilder.getInstance();

	/**
	 * 
	 */
	private ArtikelBuilder ArtikelBuilderInstance = ArtikelBuilder.getInstance();
	
	/**
	 * 
	 */
	private BestellungBuilder BestellungBuilderInstance = BestellungBuilder.getInstance();

	/**
	 * 
	 */
	private BestellpostenBuilder BestellpostenBuilderInstance = BestellpostenBuilder.getInstance();

	public static String PASS = "";

	public static String USER = "";

	/**
	 * 
	 */
	private DbManager() {
		connect();
	}
	
	/**
	 * @return
	 */
	public static DbManager getInstance() {
		if (DbManager.DbManagerInstance == null) {
			DbManager.DbManagerInstance = new DbManager();
		}
		return DbManager.DbManagerInstance;
	}

	/**
	 * @return
	 */
	protected PersonBuilder getPersonBuilder() {
		return PersonBuilderInstance;
	}
	
	/**
	 * @return
	 */
	protected ArtikelBuilder getArtikelBuilder() {
		return ArtikelBuilderInstance;
	}
	
	/**
	 * @return
	 */
	protected BestellungBuilder getBestellungBuilder() {
		return BestellungBuilderInstance;
	}

	/**
	 * @return
	 */
	protected BestellpostenBuilder getBestellpostenBuilder() {
		return BestellpostenBuilderInstance ;
	}

	/* (non-Javadoc)
	 * @see db.IDataSource#connect()
	 */
	public void connect() {
		
		try {
			//JDBC-ODBC-Treiber laden
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			
			//IP-Adresse des Db-Servers: 3306/Datenbankname;
			String url = "jdbc:mysql://localhost:3306/db_versandshop";

			this.con = DriverManager.getConnection(url, DbManager.USER, DbManager.PASS);
			
		} catch (Exception e) {
		}
	}

	/* (non-Javadoc)
	 * @see db.DataSource#close()
	 */
	public void close() {
		
		try {
			// DB-Verbindung schliessen
			con.close();
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @return
	 */
	public Connection getCon() {
		return con;
	}

	/* (non-Javadoc)
	 * @see db.PersonSource#add(model.Person)
	 */
	public void add(Person person) {
		PersonBuilderInstance.add(person);
	}
	
	
	/* (non-Javadoc)
	 * @see db.PersonSource#remove(model.Person)
	 */
	public void remove(Person person) {
		PersonBuilderInstance.remove(person);
	}

	
	/* (non-Javadoc)
	 * @see db.PersonSource#update(model.Person)
	 */
	public void update(Person person) {
		PersonBuilderInstance.update(person);
	}

	
	/* (non-Javadoc)
	 * @see db.ArtikelSource#add(model.Artikel)
	 */
	public void add(Artikel artikel) {
		ArtikelBuilderInstance.add(artikel);
	}

	
	/* (non-Javadoc)
	 * @see db.ArtikelSource#remove(model.Artikel)
	 */
	public void remove(Artikel artikel) {
		ArtikelBuilderInstance.remove(artikel);
	}

	/* (non-Javadoc)
	 * @see db.ArtikelSource#update(model.Artikel)
	 */
	public void update(Artikel artikel) {
		ArtikelBuilderInstance.update(artikel);
	}

	/* (non-Javadoc)
	 * @see db.BestellungSource#add(model.Bestellung)
	 */
	public void add(Bestellung bestellung) {
		BestellungBuilderInstance.add(bestellung);		
	}

	/* (non-Javadoc)
	 * @see db.BestellungSource#remove(model.Bestellung)
	 */
	public void remove(Bestellung bestellung) {
		BestellungBuilderInstance.remove(bestellung);
	}

	/* (non-Javadoc)
	 * @see db.BestellungSource#update(model.Bestellung)
	 */
	public void update(Bestellung bestellung) {
		BestellungBuilderInstance.update(bestellung);
	}

	/* (non-Javadoc)
	 * @see db.PersonSource#getAllPerson()
	 */
	public List<Person> getAllPerson() {
		return PersonBuilderInstance.getAllPerson();
	}

	/* (non-Javadoc)
	 * @see db.ArtikelSource#getAllArtikel()
	 */
	public List<Artikel> getAllArtikel() {
		return ArtikelBuilderInstance.getAllArtikel();
	}

	/* (non-Javadoc)
	 * @see db.BestellungSource#getAllBestellung()
	 */
	public List<Bestellung> getAllBestellung() {
		return BestellungBuilderInstance.getAllBestellung();
	}
}